'use strict';
const { Controller } = require('egg');
const COS = require('cos-nodejs-sdk-v5');
const fs = require('fs');
const CosConfig = {
  SecretId:'AKIDEOK2VjjU0JOErGRP9euviFZeU5SZT8Zr',
  SecretKey:'QdotpX0EDxSjlY6QWO1HNFtunRwGPM6b',
  Bucket: 'fresh-1356608109',
  Region: 'ap-beijing',
  Uin: '',
};
const cos = new COS({
  SecretId: CosConfig.SecretId, // 推荐使用环境变量获取；用户的 SecretId，建议使用子账号密钥，授权遵循最小权限指引，降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
  SecretKey: CosConfig.SecretKey, // 推荐使用环境变量获取；用户的 SecretKey，建议使用子账号密钥，授权遵循最小权限指引，降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
});
class UploadController extends Controller {
  /**
   * 腾讯oss上传
   */
  async file() {
    const ctx = this.ctx;

    try {
      // 获取上传的文件
      const file = await ctx.getFileStream();

      // 获取文件类型和原始文件名
      const originalFilename = file.filename; // 原始文件名

      // 生成唯一文件名，确保不重复
      const timestamp = Date.now();
      const randomString = Math.random().toString(36).substring(2, 10);
      const fileExtension = originalFilename.includes('.') ?
        originalFilename.substring(originalFilename.lastIndexOf('.')) : '';
      const newFilename = `${timestamp}_${randomString}${fileExtension}`;

      // 使用Promise包装流处理过程
      const processFileStream = () => {
        return new Promise((resolve, reject) => {
          let fileSize = 0;
          const chunks = [];

          // 监听数据块事件来计算文件大小
          file.on('data', chunk => {
            fileSize += chunk.length;
            chunks.push(chunk);
          });

          file.on('end', async () => {
            console.log('文件大小:', fileSize, '字节');
            try {
              // 将数据块组合成完整的Buffer
              const buffer = Buffer.concat(chunks);

              // 上传到腾讯云COS
              const result = await cos.putObject({
                Bucket: CosConfig.Bucket,
                Region: CosConfig.Region,
                Key: newFilename, // 使用新生成的文件名
                Body: buffer, // 使用完整的buffer而不是原始流
              });

              // 上传成功，更新文件记录的URL
              const fileUrl = 'https://' + result.Location;

              // 返回成功结果
              resolve(fileUrl);
            } catch (err) {
              reject(err);
            }
          });

          file.on('error', err => {
            console.error('文件流读取错误:', err);
            reject(err);
          });
        });
      };

      // 处理文件流并获取结果
      const result = await processFileStream();

      // 返回成功响应
      ctx.success(result);

    } catch (error) {
      ctx.error('文件上传失败: ' + (error.message || '未知错误'));
    }
  }

}

module.exports = UploadController;
